﻿package net.ojbk.saishi.service;

import java.io.IOException;
import java.util.Date;
import net.ojbk.dao.UserDataDao;
import net.ojbk.database.DatabaseConnection;
import net.ojbk.po.Email;
import net.ojbk.po.UserData;
import net.ojbk.saishi.dao.UserDataDaoV2;
import net.ojbk.saishi.dao.syMatchDao;
import net.ojbk.saishi.dao.syMatchPartDao;
import net.ojbk.saishi.po.*;
import net.ojbk.util.StringTool;
import net.ojbk.util.EmailTool;
import net.ojbk.saishi.util.ExcelTool;
import org.apache.commons.lang3.ArrayUtils; 

public class ContestantService {

	/**
	 * 描述：获取自己已参加的赛事
	 * 1、通过userId查询
	 * @return
	 */
	public static syMatch[] getPartMatch(String userId) { // yes √
		DatabaseConnection dbcon = new DatabaseConnection();
		syMatchPartDao sympd=new syMatchPartDao(dbcon);
		syMatchDao symd = new syMatchDao(dbcon);
		
		syMatchPart[] symps = sympd.queryAllRecodByUserId(userId); // 获取 已参加赛事的 的列表
		// for 循环 获取每个赛事的信息
		syMatch[] syms = new syMatch[symps.length]; // 存储 我的 每个参赛 赛事的 信息
		
		for (int i=0; i<symps.length; i++) {
			syms[i] = new syMatch();
			syms[i].setMatchId(symps[i].getMatchId());
			symd.queryOneRecord(syms[i]);
		}
		dbcon.close();
		return syms;
	}
	
	/**
	 * 描述：参加赛事，不但只是写数据库，还有excel表格、文件等操作
	 * 1、参赛记录写入 syMatchPart 数据库
	 * 2、赛事文件夹中将 收集的信息写入 excel表格 等
	 * 3、发送邮件通知发布者
	 * @param userId
	 * @param extraInfo 参赛者 填入的额外信息
	 * @return 0:异常错误	1：成功	2：已参赛
	 */
	public static int partMatch(String userId,String matchId, String[] extraInfo) { // yes
		DatabaseConnection dbcon=new DatabaseConnection();
		// 基本信息 通过 getBasicInfo() 方法获取
		// 二外信息 在 extraInfo 数组对象中
		// 表格 属性列 的构造 是基本信息 在前，额外信息在后
		
		// 判断该选手是否已经参赛
		syMatchPartDao sympd=new syMatchPartDao(dbcon);
		if (sympd.checkOneRecord(matchId, userId)) { // 已参赛
			return 2;
		}
		
		//1、参赛记录写入 syMatchPart 数据库
		Date partTime = new Date(System.currentTimeMillis()); // 参赛时间
		syMatchPart symp=new syMatchPart();
		symp.setUserId(userId);
		symp.setMatchId(matchId);
		symp.setPartTime(partTime);
		sympd.addOneRecord(symp);
		
		//2、赛事文件夹中将 收集的信息写入 excel表格 等
		String[] basicInfo=ContestantService.getBasicInfo(userId, matchId); // 获取基础信息
		String[] info = (String[]) ArrayUtils.addAll(basicInfo, extraInfo);
		
		Object[][] data = new Object[1][info.length];
		data[0]=info;
		try {
			ExcelTool.addOneData(data, MatchBackService.getExcelPath(userId, matchId));
		} catch (IOException e) {
			e.printStackTrace();
		}
		//3、发送邮件通知发布者
			// 获取发布者Id
		syMatchDao matchDao = new syMatchDao(dbcon);
		syMatch match = new syMatch();
		match.setMatchId(matchId);
		matchDao.queryOneRecord(match);
		String matchUserId = match.getUserId(); // 赛事发布者 Id
			// 获取发布者邮箱
		UserDataDaoV2 udDaov2 = new UserDataDaoV2(dbcon);
		Email email=new Email();
		email.setToEmail(udDaov2.getEmailByUserId(matchUserId));
		
		email.setTitle("师易信息科技有限公司 有人报名啦！");
		String[] extraInfoName = getExtraInfoName(matchId);
		String emailContent = "报名者(id)：" + userId 
				+ "\n赛事名称：" + match.getTitle()
				+ "\n结束时间：" + new java.sql.Timestamp(match.getEndTime().getTime())
				+ "\n赛事链接：" + "http://localhost:8080/saishi_shiyi_ojbk/saishi.jsp?matchId=" + matchId
				+ "\n报名信息：============"
				+ "\n报名时间：" + new java.sql.Timestamp(new Date().getTime());
		for (int i=0; i<extraInfoName.length; i++) {
			emailContent += "\n" + extraInfoName[i] + "：" + extraInfo[i];
		}
		email.setContent(emailContent);
		EmailTool.sendEmail(email);
		
		// 发送邮件 于 参赛者 提示已经收到赛事报名
		email.setToEmail(udDaov2.getEmailByUserId(userId));
		
		email.setTitle("师易信息科技有限公司 已收到您的报名！");
		emailContent = "发布者(id)：" + match.getUserId() 
				+ "\n赛事名称：" + match.getTitle()
				+ "\n结束时间：" + new java.sql.Timestamp(match.getEndTime().getTime())
				+ "\n报名时间：" + new java.sql.Timestamp(new Date().getTime())
				+ "\n赛事链接：" + "http://localhost:8080/saishi_shiyi_ojbk/saishi.jsp?matchId=" + matchId;
		email.setContent(emailContent);
		EmailTool.sendEmail(email);
		
		dbcon.close();
		return 1;
	}
	
	// 下面两个 方法主要用于 赛事参加页面的 构建
	public static String[] getBasicInfoName(String matchId) {  //yes
		// TODO 获取 该赛事 就基本的信息的属性名。通过数据库读取，然后分割成字符串数组
		DatabaseConnection dbcon=new DatabaseConnection();
		syMatchDao smd=new syMatchDao(dbcon);
		syMatch sym=new syMatch();
		sym.setMatchId(matchId);
		if(smd.queryOneRecord(sym)) {
			String basciInfo=sym.getBasicInfo();
			dbcon.close();
			String[] strings=StringTool.toManyString(basciInfo);
			return strings;
		}
		dbcon.close();
		return new String[0];
	}
	
	
	public static String[] getExtraInfoName(String matchId) {    //yes
		// TODO 获取  该赛事 额外需要的信息的属性名。通过数据库读取，然后分割成字符串数组
		DatabaseConnection dbcon=new DatabaseConnection();
		syMatchDao smd=new syMatchDao(dbcon);
		syMatch sym=new syMatch();
		sym.setMatchId(matchId);
		if(smd.queryOneRecord(sym)){
			String extraInfo=sym.getExtraInfo();
			dbcon.close();
			return StringTool.toManyString(extraInfo);
		}
		dbcon.close();
		return new String[0];
	}
	
	// 下面 方法主要用于 参加赛事动作 的 基本信息 的 从数据库读取
	// 也用于 参加赛事页面 基本信息内容部分的 构建
	public static  String[] getBasicInfo(String userId, String matchId) {   //yes
		// TODO 获取 参加赛事动作 的 基本信息。从UserData数据库中获取。
		String[] basciInfoName=getBasicInfoName(matchId);
		String[] basciInfo = new String[basciInfoName.length];
		UserData ud=new UserData();
		ud.setId(userId);
		UserDataDao udd=new UserDataDao();
		if (!udd.queryOneRecord(ud)) {
			return new String[0];
		}
		for (int i=0; i<basciInfoName.length; i++) {   //根据基本信息要求获取信息
			if ("id".equals(basciInfoName[i]))
				basciInfo[i] = ud.getId();
			else if ("email".equals(basciInfoName[i]))
				basciInfo[i] = ud.getEmail();
			else if ("tel".equals(basciInfoName[i]))
				basciInfo[i] = ud.getTel();
			else if ("idcard".equals(basciInfoName[i]))
				basciInfo[i] = ud.getIdcard();
			else if ("grade".equals(basciInfoName[i]))
				basciInfo[i] = ud.getGrade();
			else if ("college".equals(basciInfoName[i]))
				basciInfo[i] = ud.getCollege();
			else if ("clas".equals(basciInfoName[i]))
				basciInfo[i] = ud.getClas();
			else if ("registrationTime".equals(basciInfoName[i]))
				basciInfo[i] = ud.getRegistrationTime();
			else if ("lastIp".equals(basciInfoName[i]))
				basciInfo[i] = ud.getLastIP();
		}
		return basciInfo;
	}
}
